package cn.cs.service.impl;
import cn.cs.client.RestCsAgentShopClient;
import cn.cs.client.RestCsImageClient;
import cn.cs.client.RestCsProductClient;
import cn.cs.common.*;
import cn.cs.es.common.GeoPoint;
import cn.cs.es.document.IESDocument;
import cn.cs.es.common.EsUtils;
import cn.cs.es.query.ItemQuery;
import cn.cs.item.ItemEsQuery;
import cn.cs.item.ItemSearchVo;
import cn.cs.pojo.CsAgentShop;
import cn.cs.pojo.CsProduct;
import cn.cs.service.ItemSearchService;
import org.apache.log4j.Logger;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
@Component
public class ItemSearchServiceImpl implements ItemSearchService {

    @Resource
    private RestCsProductClient restCsProductClient;
    @Resource
    private RestCsImageClient restCsImageClient;
    @Resource
    private RestCsAgentShopClient restCsAgentShopClient;
    @Resource
    private EsUtils esUtils;

    @Value("${lastUpdatedTimeFile}")
    private String lastUpdatedTimeFile;

    private Logger logger=Logger.getLogger(ItemSearchServiceImpl.class);

    /**
     * itemquery 为前端查询各种添加的拼接
     * */
    @Override
    public Page<ItemSearchVo> queryItemList(ItemQuery itemQuery) throws Exception {
        //封装ES里面查询的实体类
        ItemEsQuery itemEsQuery=new ItemEsQuery();
        //一级分类，二级分类，区域属于精确匹配
       /* if(EmptyUtils.isNotEmpty(itemQuery.getItemTypeId1()) && itemQuery.getItemTypeId1()!=0){
            itemEsQuery.setMatchParams("itemTypeId1",itemQuery.getItemTypeId1());
        }*/
        if(EmptyUtils.isNotEmpty(itemQuery.getItemTypeId2()) && itemQuery.getItemTypeId2()!=0){
            itemEsQuery.setMatchParams("productTypeId",itemQuery.getItemTypeId2());
        }
        /*if(EmptyUtils.isNotEmpty(itemQuery.getAreaId()) && itemQuery.getAreaId()!=0 ){
            itemEsQuery.setMatchParams("areaId",itemQuery.getAreaId());
        }*/
        //搜索关键字为模糊匹配
        if(EmptyUtils.isNotEmpty(itemQuery.getKeyword())){
            itemEsQuery.setLikeMatchParams("productInfo",itemQuery.getKeyword());
        }
        //rang匹配
        /*if(EmptyUtils.isNotEmpty(itemQuery.getStartTime())){
            Long startTimeLong=DateUtil.parse(itemQuery.getStartTime(),"yyyy-MM-dd").getTime();
            itemEsQuery.setGteParams("startTimeLong",startTimeLong);
        }
        if(EmptyUtils.isNotEmpty(itemQuery.getEndTime())){
            Long endTimeLong=DateUtil.parse(itemQuery.getEndTime(),"yyyy-MM-dd").getTime();
            itemEsQuery.setLteParams("startTimeLong",endTimeLong);
        }*/
        //指定排序的字段("saleCount"："销量","distance":"最近演出")
       /* if(EmptyUtils.isNotEmpty(itemQuery.getSort())){
            if(itemQuery.getSort().equals("saleCount")){
                itemEsQuery.setDesc("saleCount");
            }else if(itemQuery.getSort().equals("distance")){
                itemEsQuery.setAsc("distance");
            }
        }*/
       if(EmptyUtils.isNotEmpty(itemQuery.getSort())){
            if(itemQuery.getSort().equals("saleCount")){
                itemEsQuery.setDesc("saleCount");
            }
        }
        itemEsQuery.setPageNo(itemQuery.getCurrentPage());
        itemEsQuery.setPageSize(itemQuery.getPageSize());
        return esUtils.queryPage(itemEsQuery);
    }

    /***
     * 导入item数据
     * @throws Exception
     * cron表达式，设置执行的时间点
     * 由6~7个部分构成
     * 秒   分钟     小时    每个月中第几天    月    每个星期第几天（每周几）   年份
     * *号表示每分每秒都要执行
     * ，号表示列举条件，比如小时的位置2,3凌晨2点，3点执行
     * /号表示频次，如果2/1表示凌晨2点开始执行，每小时执行一次
     * -号表示区间，比如小时的位置2-4，就表示在2点到4点之间执行
     * ？号用在每月中的或者每周中的第几天，避免和*号产生干扰
     * "0 0/1 * * * ?"表示每分钟更新一次
     */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void importItemList()throws Exception{
        Map<String,Object> params=new HashMap<String,Object>();
        //获取上次更新时间
        String lastUpdatedTime= getLastUpdatedTime();
        if(EmptyUtils.isNotEmpty(lastUpdatedTime)){
            params.put("lastUpdatedTime",lastUpdatedTime);
        }
        //查询更新的内容
        List<CsProduct> csProductList=restCsProductClient.getCsProductListByMap(params);
        //输出结果的封装
        List<IESDocument> itemSearchVoList=new ArrayList<IESDocument>();
        if(EmptyUtils.isNotEmpty(csProductList)){
            for (CsProduct csProduct:csProductList){
                ItemSearchVo itemSearchVo=new ItemSearchVo();
                //对应属性拷贝
                BeanUtils.copyProperties(csProduct,itemSearchVo);
                //更新位置
                CsAgentShop csAgentShop = restCsAgentShopClient.getAgentShopById(csProduct.getShopId());
                GeoPoint geoPoint = new GeoPoint();
                geoPoint.setLat(Double.parseDouble(csAgentShop.getLat()));
                geoPoint.setLon(Double.parseDouble(csAgentShop.getLon()));
                itemSearchVo.setLocation(geoPoint);
                //更新销量
                itemSearchVo.setSaleCount(restCsProductClient.getProductSaleCountById(csProduct.getId()));
                itemSearchVoList.add(itemSearchVo);
            }
        }
        //更新最后更新时间
        logger.info("<<<<<<<<"+DateUtil.format(new Date())+"更新了"+itemSearchVoList.size()+"数据>>>>>>>>>");
        lastUpdatedTime=DateUtil.format(new Date());
        FileUtils.writeInFile(lastUpdatedTimeFile,lastUpdatedTime);
        //将数据库中查到的更新同步到索引库里
        if(EmptyUtils.isNotEmpty(itemSearchVoList)){
            esUtils.addBatchESModule(itemSearchVoList);
        }
    }
    /**
     *获取上次更新时间
     * */
    public String getLastUpdatedTime() throws IOException {
        FileUtils.createIfNotExist(lastUpdatedTimeFile);
        return FileUtils.readFileByLine(lastUpdatedTimeFile);
    }
}
